package ar.uba.fi.tecnicas.fabrica;

import java.util.*;
import ar.uba.fi.tecnicas.fabrica.exceptions.*;

public class Pieza 
{
	private List<MateriaPrima> materiasPrimas = null;	
	private List<Transformacion> transformaciones = null;
	
	private ItemLineaProduccion item = null;
	
	private TipoProducto tipoProducto = null;
	
	private int calidad = 0;
	
	public Pieza (List<MateriaPrima> materiaPrima) throws PiezaSinMateriaPrimaException
	{
		this.validarMateriaPrima(materiaPrima);

		this.transformaciones = new ArrayList<Transformacion>();
		this.materiasPrimas = materiaPrima;
	}
	
	private void validarMateriaPrima(List<MateriaPrima> materiaPrima) throws PiezaSinMateriaPrimaException  
	{
		List<MateriaPrima> materiaARemover = new ArrayList<MateriaPrima>();
		
		for(MateriaPrima materia : materiaPrima)
		{
			if(materia.getCantidad() <= 0)
			{			
				materiaARemover.add(materia);
			}
		}
		
		for(MateriaPrima materia : materiaARemover)
		{
			materiaPrima.remove(materia);
		}
		
		if(materiaPrima.size() == 0)
		{
			throw new PiezaSinMateriaPrimaException(); 
		}
	}

	public void transformar(Transformacion transformacion, int calidad) throws TransformacionInvalidaException
	{
		this.validarTransformar(transformacion);
		this.calidad *= calidad / 100;
		this.transformaciones.add(transformacion);
	}
	
	/// Asocia la pieza con un item
	public void ingresar(ItemLineaProduccion item)
	{
		this.item = item;
	}
	
	public void entregar()
	{
		this.item = null;
	}
	
	public List<Transformacion> getTransformaciones()
	{
		return this.transformaciones;		
	}
	
	public List<MateriaPrima> getMateriasPrimas()
	{
		return this.materiasPrimas;		
	}
	
	public int getCalidad()
	{
		return this.calidad;
	}
	
	private void validarTransformar(Transformacion transformacion) throws TransformacionInvalidaException
	{
		if(this.transformaciones.size() > 0)
		{
			int indice = this.transformaciones.size() - 1;
			Transformacion ultima = this.transformaciones.get(indice);
			
			if(ultima.equals(transformacion))
			{
				throw new TransformacionInvalidaException();
			}
		}
	}

	public void validarIngresar(ItemLineaProduccion item) throws PiezaConItemAsignadoException
	{
		if(this.item != null && !this.item.equals(item))
			throw new PiezaConItemAsignadoException();
	}

	public void mejorarCalidad(int porcentajeMejora) 
	{
		if(porcentajeMejora > 0 && porcentajeMejora < 100)
		{
			this.calidad *= ((float)(100 + porcentajeMejora) / (float)100);
			
			if(this.calidad > 100)
			{
				this.calidad = 100;
			}
		}
	}

	public void setTipoProducto(TipoProducto tipoProducto) 
	{
		this.tipoProducto = tipoProducto;
	}
	
	public TipoProducto getTipoProducto()
	{
		return this.tipoProducto;
	}
}
